//封装一个请求工具 
//1.创建一个新的axios实例
//2.请求拦截器,如果有token进行头部携带
//3.响应拦截器,1.剥离无效数据,,获取有效数据 2.处理token失效
//4.导出一个函数,调用当前的axios实例发请求,返回值promise
import router from "@/router";
import store from "@/store";
import axios from "axios";

//1.创建一个新的axios实例
//到处基准地址,原因:其他地方(图片上传)不是通过axios`发请求的地方用上基准地址
export const baseURL = "http://pcapi-xiaotuxian-front-devtest.itheima.net"
const instance = axios.create({
        //设计基准路劲
        //配置请求的基准url地址
        baseURL: baseURL,
        //过期时间
        timeout: 5000
    })
    //2.请求拦截器,如果有token进行头部携带
instance.interceptors.request.use(config => {
        //响应正确
        //拦截业务逻辑
        //进行请求配置修改
        //如果本地有token,就在请求头部中携带token
        //1.获取用户信息对象
        const { profile } = store.state.user
            //2.判断是否有token
        if (profile.token) {
            config.headers.Authorization = `Bearer ${profile.token}`
        }
        return config
    }), err => {
        //响应错误
        return Promise.reject(err)
    }
    //3.响应拦截器,1.剥离无效数据,,获取有效数据 2.处理token失效
instance.interceptors.response.use(res => res, err => {
        //401 状态码,进入该函数
        if (err.response && err.response.status === 401) {
            //1.清除无效用户信息
            store.commit('user/setUser', {})
                //2.跳转到登录页

            //3.跳转页面需要传递参数(当前的路由地址)给登录页
            //当前路由地址
            //组件里面:'/user?a=10' $router.path==='/' $router.fullpath==='/user?a=10'
            //js模块中 route.currentRoute.value.fullpath 获取当前的路由地址,route.currentRoute是ref响应式数据
            const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
                // encodeURIComponent转换url编码,防止解析地址出错
            router.push('/login?redirectUrl' + fullPath)
        }
        return Promise.reject(err)
    })
    //请求工具函数
export default (url, method, submitData) => {
    //负责发请求:请求地址,请求方式,提交的数据
    return instance({
        url,
        method,
        //1.如果是get请求 需要使用params来传递submitData    ？a=10&c=10
        //2.如果不是get请求 需要使用data来传递submitData    请求体传参
        //[] 设置一个动态的key,写js表达式,js表达式的执行结果当作KEY
        //method参数:get,GET,Get 转化成信息再来判断
        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
    })
}